package com.doudou.collection.domain.service.impl;

import com.doudou.collection.dao.mapper.BlogMapper;
import com.doudou.collection.domain.service.BlogService;
import com.doudou.collection.infrastructure.common.security.CurrentPrincipal;
import com.doudou.collection.orm.dto.BlogDTO;
import com.doudou.collection.orm.entity.Blog;
import com.doudou.collection.orm.vo.BlogCategoriesVO;
import com.doudou.collection.orm.vo.BlogDetailVO;
import com.doudou.collection.orm.vo.BlogSimpleVO;
import com.doudou.collection.orm.vo.ContentIndexVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PathVariable;
import springfox.documentation.annotations.ApiIgnore;

import java.util.List;

/**
 * @ClassName BlogServiceImpl<br>
 * @Description 文章业务逻辑类实现类 <br>
 * @Author 李浩文<br>
 * @Date 2023/6/13 20:51<br>
 * @Version 1.0<br>
 */
@Slf4j
@Service
@Transactional
public class BlogServiceImpl implements BlogService {

    @Autowired
    private BlogMapper blogMapper;


    /**
     * 发布文章功能
     * @param blogDTO
     * @return
     */
    @Override
    public void insert(CurrentPrincipal currentPrincipal, String articleLocation,BlogDTO blogDTO) {
        log.debug("用户发布的文章信息 {}", blogDTO);
        Blog blog = new Blog();
        BeanUtils.copyProperties(blogDTO, blog);
        blog.setUserId(currentPrincipal.getUserId());
        blogMapper.insert(blog);

        log.info("用户发布文章成功");

    }

    /**
     * 删除文章
     * @param id
     * @return
     */
    @Override
    public void delete(@PathVariable Long id){
        log.debug("正在处理根据id删除文章业务，id为：{}",id);
        blogMapper.delete(id);

    }


    /**
     * 根据id获取文章具体信息,每查询一次增加一个浏览量
     * @param id
     * @return
     */
    @Override
    public BlogDetailVO detailById(@PathVariable Long id) {
        //通过id查询表示浏览了一次
        log.debug("正在处理根据id增加文章浏览量的业务");
        blogMapper.updateViewCountById(id);

        log.debug("正在处理根据id显示文章详情业务，id为：{}",id);
        BlogDetailVO contentDetailVO = blogMapper.detailById(id);

        return contentDetailVO;
    }


    /**
     * 获取文章的所有类别
     * @param
     * @return
     */
    @Override
    public List<BlogCategoriesVO> selectAllCategories() {
        log.debug("正在处理获取文章的所有类别业务");
        List<BlogCategoriesVO> list = blogMapper.selectAllCategories();
        return list;
    }



    /**
     * 根据分类id获取文章列表功能
     * @param categoriesId
     * @return
     */
    @Override
    public List<ContentIndexVO> queryAllArticle(@PathVariable Integer categoriesId) {
        log.debug("正在处理根据分类id获取文章业务,分类id为 {}", categoriesId);
        List<ContentIndexVO> list = blogMapper.selectByCategoriesId(categoriesId);
        log.info("主页文章查询成功");

        return list;
    }

    @Override
    public List<ContentIndexVO> recommendedBlog() {
        log.debug("正在处理显示推荐所有文章业务");
        List<ContentIndexVO> list = blogMapper.recommendedBlog();
        log.info("显示推荐所有文章成功");

        return list;

    }

    /**
     * 根据用户点赞表更新文章点赞数量
     * @param blogId
     * @return
     */
    @Override
    public void updateBlogLikedFromUserLiked(Long blogId) {
        log.debug("正在通过文章id处理文章被点赞数量, {}", blogId);
        blogMapper.updateBlogLikedFromUserLiked(blogId);
    }


    @Override
    public List<BlogSimpleVO> selectOthersByUserId(@PathVariable Long userId) {
        log.debug("正在处理在文章详情页获取该作者的其他文章业务");
        List<BlogSimpleVO> blogSimpleVO = blogMapper.selectOthersByUserId(userId);

        return blogSimpleVO;
    }


    /**
     * 获取热门文章功能
     * @return
     */
    @Override
    public List<BlogSimpleVO> selectHot() {
        log.debug("正在处理获取热门文章业务");
        List<BlogSimpleVO> blogSimpleVO = blogMapper.selectHot();
        return blogSimpleVO;
    }



    /**
     * 根据关键字搜索文章功能
     * @param wd
     * @return
     */
    @Override
    public List<ContentIndexVO> search(String wd) {
        log.info("正在处理根据关键字搜索文章业务，关键字为：{}",wd);

        return blogMapper.queryListBySearch(wd);
    }


    /**
     * 查询用户发布的所有文章
     * @param id
     * @return
     */
    @Override
    public List<ContentIndexVO> selectSelfBlogsById(@PathVariable Long id) {
        log.info("正在处理查询用户发布的所有文章业务，用户id为：{}",id);
        List<ContentIndexVO> list = blogMapper.selectSelfBlogsById(id);
        log.info("查询成功");

        return list;

    }


    /**
     * 查询用户点赞的所有文章
     * @param id
     * @return
     */
    @Override
    public List<ContentIndexVO> selectLikeBlogsAllById(Long id) {
        log.info("正在处理查询用户点赞的所有文章业务，用户id为：{}",id);
        List<ContentIndexVO> list = blogMapper.selectLikeBlogsAllById(id);
        log.info("查询成功");

        return list;
    }

    /**
     * 查询用户收藏的所有文章
     * @param id
     * @return
     */
    @Override
    public List<ContentIndexVO> selectCollectBlogsAllById(Long id) {
        log.info("正在处理查询用户收藏的所有文章业务，用户id为：{}",id);
        List<ContentIndexVO> list = blogMapper.selectCollectBlogsAllById(id);
        log.info("查询成功");

        return list;
    }

}
